import logging
from logging.handlers import RotatingFileHandler

from flask_sqlalchemy import SQLAlchemy
from redis import StrictRedis
from flask_session import Session
#将config是py文件中含有Config 导入
# from config import Config
#接收参数后，不能继续使用Config
from config import config_dict
from flask import Flask
from flask_wtf.csrf import CSRFProtect



#定义redis_store 将局部变量转换成全局变量 可以网views中导入
#如果变量在方法内部是不可以当成模块导入别的文件中，所以需要在外部声明一下，进行初始化
redis_store = None

#创建SQLAlchemy对象
db = SQLAlchemy()

#接收manager参数命名为config_name
#根据传递不同配置的key（create_app()的参数），获取不同的配置类信息（加载不同的环境）
def create_app(config_name):



    app = Flask(__name__)

    #通过配置的key，获取配置信息
    #参数不能写成固定值，必须要有灵活性
    #取出来的配置类里面都有一个LEVEL_NAME
    config = config_dict.get(config_name)

    # 调用日志方法
    log_file(config.LEVEL_NAME)

    #默认参数Config，但是接收参数后就不应该在使用
    # app.config.from_object(Config)
    app.config.from_object(config)

    # 创建SQLAlchemy对象，关联app
    # db = SQLAlchemy(app)   #这一句话可以拆分成两句话 db = SQLAlchemy()  db.init_app(app)
    # 创建了一个SQLAlchemy对象  ctrl+鼠标左键点进去之后  self就是SQLAlchemy这个对象，向下执行if app is not None:实际上就是读取app的配置信息，必须传进去app对象
    #相当于线创建了一个SQLAlchemy空的对象 再读取app中的信息
    # db = SQLAlchemy()  放在redis_store下方
    db.init_app(app)

    # 创建redis对象，关联app
    # redis_store = StrictRedis(host=Config.REDIS_HOST, port=Config.REDIS_PORT, decode_responses=True)
    #使用global将该处redis_store声明成变量，redis_store定义成全局变量，不声明会报错，找不到该变量，views中set获取不到值
    global redis_store
    redis_store = StrictRedis(host=config.REDIS_HOST, port=config.REDIS_PORT, decode_responses=True)

    # 读取app中session配置信息
    Session(app)

    # 保护app
    # CSRFProtect配置可对（post、put、dispatch、delete）四种请求实施保护
    CSRFProtect(app)

    #注册首页蓝图index_blue,到app中
    from info.modules.index import index_blue
    app.register_blueprint(index_blue)

    return app

#配置日志信息，记录程序运行过程
def log_file(level_name):
    # 设置日志的记录等级  ctrl+鼠标左键点击DEBUG 可以看见级别 常见的四种等级DEBUG < INFO < WARING < ERROR
    #项目上线之后可以更改等级 可以控制出现错误信息  只有大于等于该等级才会打印
    logging.basicConfig(level=level_name) # 调试debug级
    # 创建日志记录器，指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限   编号0-10共11个文件，储存不够就删除最前面的文件，最下面再创建一个新的文件
    file_log_handler = RotatingFileHandler("/home/python/Desktop/imfomation17/logs/log", maxBytes=1024*1024*100, backupCount=10)
    # 创建日志记录的格式                 日志等级   输入日志信息的文件名   行数       日志信息
    formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
    # 为刚创建的日志记录器设置日志记录格式
    file_log_handler.setFormatter(formatter)
    # 为全局的日志工具对象（flask app使用的）添加日志记录器
    logging.getLogger().addHandler(file_log_handler)